package com.zhiyou.tools;

import java.util.Properties;  

import javax.mail.Address;  
import javax.mail.BodyPart;  
import javax.mail.Message;  
import javax.mail.Multipart;  
import javax.mail.Session;  
import javax.mail.Transport;  
import javax.mail.internet.InternetAddress;  
import javax.mail.internet.MimeBodyPart;  
import javax.mail.internet.MimeMessage;  
import javax.mail.internet.MimeMultipart;  
  
public class SentEmail {  
  
    private MimeMessage mimeMsg;  
    private Session session;  
    private Properties props;  
    private String username;  
    private String password;  
    private Multipart mp;  
  
    public SentEmail() {  
    }  
  
    public SentEmail(String smtp) {  
        setSmtpHost(smtp);  
        createMimeMessage();  
    }  
  
    private void setSmtpHost(String smtp) {  
        System.out.println("设置系统属性：mail.smtp.host  " + smtp);  
        if (null == props) {  
            props = System.getProperties();  
        }  
        props.put("mail.smtp.host", smtp);  
    }  
  
    private boolean createMimeMessage() {  
        try {  
            System.out.println("准备获取邮件会话对象！");  
            session = Session.getDefaultInstance(props, null);  
        } catch (Exception e) {  
            System.out.println("获取邮件会话错误！" + e);  
            return false;  
        }  
        System.out.println("准备创建MIME邮件对象！");  
        try {  
            mimeMsg = new MimeMessage(session);  
            mp = new MimeMultipart();  
            return true;  
        } catch (Exception e) {  
            System.out.println("创建MIME邮件对象失败！" + e);  
            return false;  
        }  
    }  
  
    /** 
     * 定义SMTP是否需要验证 
     */  
    public void setNeedAuth(boolean need) {  
        System.out.println("设置smtp身份认证：mail.smtp.auth = " + need);  
        if (null == props) {  
            props = System.getProperties();  
        }  
        if (need)  
            props.put("mail.smtp.auth", "true");  
        else  
            props.put("mail.smtp.auth", "false");  
    }  
  
    public void setNameAndPassword(String username, String password) {  
        this.username = username;  
        this.password = password;  
    }  
  
    /** 
     * 定义邮件主题 
     *  
     * @return 
     */  
    public boolean setSubject(String mailSubject) {  
        System.out.println("定义邮件主题！");  
        try {  
            mimeMsg.setSubject(mailSubject);  
            return true;  
        } catch (Exception e) {  
            System.err.println("定义邮件主题发生错误！" + e);  
            return false;  
        }  
    }  
  
    public boolean setBody(String mailBody) {  
        try {  
            BodyPart bp = new MimeBodyPart();  
            bp.setContent("" + mailBody, "text/html;charset=GBK");  
            mp.addBodyPart(bp);  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    }  
  
    /** 
     * 设置发信人 
     *  
     * @return 
     */  
    public boolean setFrom(String from) {  
        System.out.println("设置发信人！");  
        try {  
            mimeMsg.setFrom(new InternetAddress(from));  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    }  
  
    /** 
     * 定义收信人 
     *  
     * @param to 
     * @return 
     */  
    public boolean setTo(String to) {  
        if (to == null) {  
            System.out.println("没有定义收信人！");  
            return false;  
        }  
        System.out.println("定义收信人！");  
        try {  
            mimeMsg.setRecipients(Message.RecipientType.TO,  
                    InternetAddress.parse(to));  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    }  
  
    /** 
     * 定义抄送人 
     *  
     * @param copyto 
     * @return 
     */  
    public boolean setCopyTo(String copyto) {  
        if (copyto == null)  
            return false;  
        try {  
            mimeMsg.setRecipients(Message.RecipientType.CC,  
                    (Address[]) InternetAddress.parse(copyto));  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    }  
  
    public boolean sendOut() {  
        try {  
            mimeMsg.setContent(mp);  
            mimeMsg.saveChanges();  
            System.out.println("邮件发送中....");  
            Session mailSession = Session.getInstance(props, null);  
            Transport transport = mailSession.getTransport("smtp");  
            transport.connect((String) props.get("mail.smtp.host"), username,  
                    password);  
            transport.sendMessage(mimeMsg,  
                    mimeMsg.getRecipients(Message.RecipientType.TO));  
            System.out.println("发送成功！");  
            transport.close();  
            return true;  
        } catch (Exception e) {  
            System.err.println("邮件失败！" + e);  
            return false;  
        }  
    }  
  
    /** 
     * 调用sendOut方法完成发送 
     *  
     * @param smtp 
     * @param from 
     * @param to 
     * @param copyto 
     * @param subject 
     * @param content 
     * @param username 
     * @param password 
     * @return 
     */  
    public static boolean sendAndCc(String smtp, String from, String to,  
            String copyto, String subject, String content, String username,  
            String password) {  
        SentEmail theMail = new SentEmail(smtp);  
        theMail.setNeedAuth(true); // 验证  
        if (!theMail.setSubject(subject))  
            return false;  
        if (!theMail.setBody(content))  
            return false;  
        if (!theMail.setTo(to))  
            return false;  
        if (!theMail.setCopyTo(copyto))  
            return false;  
        if (!theMail.setFrom(from))  
            return false;  
        theMail.setNameAndPassword(username, password);  
        if (!theMail.sendOut())  
            return false;  
        return true;  
    }  
  
    public static void main(String[] args) {  
        String smtp = "smtp.163.com";// smtp服务器  
        String from = "m15239261761_1@163.com";// 邮件显示名称  
        String to = "2225219552@qq.com";// 收件人的邮件地址，必须是真实地址  
        String copyto = "";// 抄送人邮件地址  
        String subject = "你好";// 邮件标题  
        String content = "温";// 邮件内容  
        String username = "m15239261761_1@163.com";// 发件人真实的账户名  
        String password = "wenxiaohui1993";// 发件人密码  
        SentEmail.sendAndCc(smtp, from, to, copyto, subject, content, username,  
                password);  
    }  
  
}